Row Level এবং Statement Level Triggers

Database Tutorials - পিএল/এসকিউএল (PL/SQL) - PL/SQL Triggers
202

Triggers হলো PL/SQL এর একটি গুরুত্বপূর্ণ ফিচার যা একটি নির্দিষ্ট ইভেন্ট বা ডাটাবেস অপারেশন (যেমন INSERT, UPDATE, DELETE) ঘটলে স্বয়ংক্রিয়ভাবে চলতে থাকে। Triggers ব্যবহার করে ডাটাবেসের ডেটা অবস্থা পরিবর্তন বা অন্যান্য কার্যকলাপের উপর নজর রাখা যায়। Triggers প্রধানত দুটি প্রকারে ভাগ করা হয়: Row Level Triggers এবং Statement Level Triggers


১. Row Level Trigger

Row Level Trigger তখন কার্যকর হয় যখন প্রতিটি রেকর্ড (row) উপর একটি নির্দিষ্ট অপারেশন (যেমন INSERT, UPDATE, DELETE) ঘটানো হয়। প্রতিটি affected রেকর্ডের জন্য আলাদাভাবে trigger চালানো হয়।

উদাহরণ:

ধরা যাক, আপনি একটি employees টেবিলের জন্য একটি row-level trigger তৈরি করতে চান, যা যখন salary কলামে কোনো পরিবর্তন হয় তখন একটি audit_log টেবিলে লগ রাখবে।

CREATE OR REPLACE TRIGGER employee_salary_update
AFTER UPDATE OF salary ON employees
FOR EACH ROW
BEGIN
   -- Log the update to audit_log table
   INSERT INTO audit_log (employee_id, old_salary, new_salary, update_time)
   VALUES (:OLD.employee_id, :OLD.salary, :NEW.salary, SYSDATE);
END;

এখানে,

  • AFTER UPDATE OF salary ON employees — যখন employees টেবিলের salary কলাম আপডেট হয়।
  • FOR EACH ROW — প্রতিটি affected row এর জন্য trigger কার্যকর হবে।
  • :OLD.salary — পুরনো salary (যেহেতু এটি UPDATE অপারেশন, তাই আগের মান পাওয়া যাবে)।
  • :NEW.salary — নতুন salary (যেহেতু এটি UPDATE অপারেশন, তাই নতুন মান পাওয়া যাবে)।

এই triggerটি প্রতিটি row আপডেট হওয়ার পরে চালানো হবে এবং সংশ্লিষ্ট তথ্য audit_log টেবিলে ইনসার্ট হবে।

Row Level Trigger এর সুবিধা:

  • প্রতিটি রেকর্ডের জন্য পৃথক কাজ: এটি যখন প্রতিটি affected row-এ আলাদাভাবে কাজ করতে হয়, যেমন বিশেষভাবে UPDATE বা DELETE অপারেশনগুলির জন্য।
  • বিশেষ প্রয়োজনে কাজ: যখন আপনাকে নির্দিষ্ট ডেটা, যেমন পুরনো এবং নতুন মানের মধ্যে পার্থক্য ট্র্যাক করতে হয়।

২. Statement Level Trigger

Statement Level Trigger একাধিক রেকর্ডের উপর একই অপারেশন করার পরিবর্তে, একটি SQL স্টেটমেন্টের সম্পূর্ণ প্রক্রিয়ার পরপরই কার্যকর হয়। এই trigger শুধুমাত্র একবার চালানো হয়, যদি পুরো statement (যেমন INSERT, UPDATE, DELETE) সফল হয়, তা নির্বিশেষে affected row এর সংখ্যা কেমনই হোক না কেন।

উদাহরণ:

ধরা যাক, আপনি একটি employees টেবিলের জন্য একটি statement-level trigger তৈরি করতে চান, যা যখন একটি INSERT অপারেশন হবে, তখন পুরো টেবিলের রেকর্ডের সংখ্যা একটি লগ টেবিলে সংরক্ষণ করবে।

CREATE OR REPLACE TRIGGER employee_insert_count
AFTER INSERT ON employees
BEGIN
   -- Log the total number of employees after each insert
   INSERT INTO employee_count_log (employee_count, log_time)
   VALUES ((SELECT COUNT(*) FROM employees), SYSDATE);
END;

এখানে,

  • AFTER INSERT ON employees — যখন employees টেবিলে একটি নতুন রেকর্ড ইনসার্ট হবে।
  • INSERT INTO employee_count_log — এটি employee_count_log টেবিলে সমস্ত কর্মচারীর সংখ্যা একটি লগ হিসেবে সঞ্চিত করবে।

এটি কেবলমাত্র একটি বার কার্যকর হবে, প্রতিটি INSERT অপারেশনের জন্য, এবং affected row এর সংখ্যা নির্বিশেষে।

Statement Level Trigger এর সুবিধা:

  • একই অপারেশনের জন্য একাধিক রেকর্ডের পরিবর্তে একবার কাজ: যখন একাধিক affected rows না হলেও, একটি বার কাজ করতে হয় (যেমন লগিং বা মোট সঠিক সংখ্যা নির্ণয়)।
  • দ্রুত কর্ম: প্রতিটি affected row এর পরিবর্তে একবার কাজ করার ফলে কার্যকারিতা সাধারণত ভালো হয়।

Row Level এবং Statement Level Trigger এর মধ্যে পার্থক্য

বৈশিষ্ট্যRow Level TriggerStatement Level Trigger
কার্যকর হওয়ার সময়প্রতিটি affected row এর জন্য আলাদাভাবেপুরো SQL স্টেটমেন্টের একবার পর কার্যকর
ব্যবহারএকক রেকর্ডের উপর কাজ করতে ব্যবহৃতএকাধিক রেকর্ড বা একটি সাধারণ কাজের জন্য ব্যবহৃত
কোড উদাহরণFOR EACH ROWকোন FOR EACH ROW ক্লজ নেই
প্রত্যাশিত ফলাফলপ্রতিটি affected row এর জন্য trigger চলবেএকবার পুরো SQL statement সফল হলে trigger চলবে
পারফরম্যান্সবেশি ব্যয়বহুল হতে পারে, কারণ প্রতিটি row এর জন্য trigger চলেসাধারনভাবে দ্রুত, কারণ একবার কাজ করা হয়

উদাহরণগুলি

Row Level Trigger উদাহরণ:

যখন একটি DELETE অপারেশন হয়, তখন affected row গুলির জন্য একটি লোগ তৈরি করতে Row Level Trigger ব্যবহার করা যেতে পারে।

CREATE OR REPLACE TRIGGER delete_employee_log
AFTER DELETE ON employees
FOR EACH ROW
BEGIN
   -- Log deleted employee data into audit log
   INSERT INTO deleted_employee_log (employee_id, employee_name, delete_time)
   VALUES (:OLD.employee_id, :OLD.employee_name, SYSDATE);
END;

এখানে, প্রতিটি affected row এর জন্য delete_employee_log trigger কার্যকর হবে এবং deleted employee এর তথ্য লগে সংরক্ষিত হবে।

Statement Level Trigger উদাহরণ:

একটি UPDATE অপারেশন পর, পুরো টেবিলের সংখ্যার একটি লগ তৈরি করতে Statement Level Trigger ব্যবহার করা যেতে পারে।

CREATE OR REPLACE TRIGGER update_employee_log
AFTER UPDATE ON employees
BEGIN
   -- Log the total number of employees after every update
   INSERT INTO update_log (log_time, employee_count)
   VALUES (SYSDATE, (SELECT COUNT(*) FROM employees));
END;

এটি UPDATE অপারেশন পর পুরো টেবিলের মোট কর্মচারীর সংখ্যা লোগ করবে।


উপসংহার

Row Level Triggers এবং Statement Level Triggers এর মধ্যে প্রধান পার্থক্য হল যে row level trigger প্রতিটি affected row এর জন্য আলাদাভাবে কাজ করে, whereas statement level trigger সম্পূর্ণ SQL স্টেটমেন্টের জন্য একবার কাজ করে। কোনটি ব্যবহার করবেন তা আপনার ব্যবহারের পরিস্থিতির উপর নির্ভর করবে। Row Level Trigger ব্যবহার করা হয় যখন আপনি প্রতিটি row এর উপর বিস্তারিত কার্যকলাপ চান, এবং Statement Level Trigger ব্যবহার করা হয় যখন একই ধরনের কাজ একবার সম্পাদন করতে হবে।

Content added By
Promotion
NEW SATT AI এখন আপনাকে সাহায্য করতে পারে।

Are you sure to start over?

Loading...